package com.example.tenant.config;

import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.handler.TenantLineHandler;
import com.baomidou.mybatisplus.extension.plugins.inner.TenantLineInnerInterceptor;
import net.sf.jsqlparser.expression.Expression;
import net.sf.jsqlparser.expression.LongValue;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class MyBatisPlusConfig {

    /**
     * 多租户插件配置
     */
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();

        // 添加多租户拦截器
        interceptor.addInnerInterceptor(tenantLineInnerInterceptor());
        interceptor.addInnerInterceptor(new MaxLengthInnerInterceptor());

        return interceptor;
    }

    /**
     * 租户处理器
     */
    private TenantLineInnerInterceptor tenantLineInnerInterceptor() {
        return new TenantLineInnerInterceptor(new TenantLineHandler() {
            // 指定租户 ID 字段名（需与数据库表中字段一致）
            @Override
            public String getTenantIdColumn() {
                return "tenant_id";
            }

            // 获取当前租户 ID（实际项目中从 ThreadLocal/Token 中获取）
            @Override
            public Expression getTenantId() {
                // 示例：固定返回租户 ID=1（实际需动态获取，如从上下文获取当前登录用户的租户 ID）
                return new LongValue(1L);
            }

            // 忽略租户过滤的表（可选）
            @Override
            public boolean ignoreTable(String tableName) {
                // 例如：字典表不需要租户隔离
                return "sys_dict".equals(tableName);
            }
        });
    }
}
